home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / tools / developer-tools / c-tools / c_examples / led / ptrdlist.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-16  |  2.3 KB  |  154 lines

  1. //////////////////////////////////////////////////////////////////////////////
  2. // ptrdlist.cpp
  3. //
  4. // Jeffry A Worth
  5. // January 26, 1996
  6. //////////////////////////////////////////////////////////////////////////////
  7.  
  8. //////////////////////////////////////////////////////////////////////////////
  9. // INCLUDES
  10. #include "aframe:include/ptrdlist.hpp"
  11.  
  12. //////////////////////////////////////////////////////////////////////////////
  13. // AFPtrDlist Class
  14. AFPtrDlist::AFPtrDlist()
  15.     :m_head(NULL),
  16.     m_tail(NULL),
  17.     m_entries(0)
  18. {
  19. }
  20.  
  21. AFPtrDlist::~AFPtrDlist()
  22. {
  23.     cleanAndDestroy();
  24. }
  25.  
  26. BOOL
  27. AFPtrDlist::append(AFObject* ptr)
  28. {
  29.     AFNode *node, *temp;
  30.  
  31.     if(node = new AFNode(ptr)) {
  32.         node->prev(temp=m_tail);
  33.         m_tail=node;
  34.         if(temp)
  35.             temp->next(node);
  36.         if(!m_head)
  37.             m_head=m_tail;
  38.         m_entries++;
  39.         ptr->m_node = node;
  40.         return TRUE;
  41.     }
  42.     return FALSE;
  43. }
  44.  
  45. BOOL
  46. AFPtrDlist::prepend(AFObject* ptr)
  47. {
  48.     AFNode *node, *temp;
  49.  
  50.     if(node = new AFNode(ptr)) {
  51.         node->next(temp=m_head);
  52.         m_head=node;
  53.         if(temp)
  54.             temp->prev(node);
  55.         if(!m_tail)
  56.             m_tail=m_head;
  57.         m_entries++;
  58.         ptr->m_node=node;
  59.         return TRUE;
  60.     }
  61.     return FALSE;
  62. }
  63.  
  64. BOOL
  65. AFPtrDlist::isEmpty()
  66. {
  67.     return(m_entries==0);
  68. }
  69.  
  70. AFNode*
  71. AFPtrDlist::nodeAt(ULONG index)
  72. {
  73.     AFNode* node;
  74.     long i;
  75.  
  76.     if(index >= 0 && index < entries()) {
  77.         if(index<=entries()/2) {
  78.             node=m_head;
  79.             for(i=0;i<index;i++)
  80.                 node=node->next();
  81.             return node;
  82.         } else {
  83.             node=m_tail;
  84.             for(i=0;i<entries()-index-1;i++)
  85.                 node=node->prev();
  86.             return node;
  87.         }
  88.     }
  89.     return NULL;
  90. }
  91.  
  92.  
  93. AFObject*
  94. AFPtrDlist::operator[](ULONG index)
  95. {
  96.     AFNode* node;
  97.  
  98.     if(node=nodeAt(index))
  99.         return node->object();
  100.     return NULL;
  101. }
  102.  
  103. ULONG
  104. AFPtrDlist::entries()
  105. {
  106.     return m_entries;
  107. }
  108.  
  109. void
  110. AFPtrDlist::remove(ULONG index, BOOL deleteobject)
  111. {
  112.     removeNode(nodeAt(index),deleteobject);
  113. }
  114.  
  115. void
  116. AFPtrDlist::removeNode(AFNode* node, BOOL deleteobject)
  117. {
  118.     AFNode *nPrev,*nNext;
  119.  
  120.     if(node) {
  121.         nPrev=node->prev();
  122.         nNext=node->next();
  123.  
  124.         if(nNext) {
  125.             nNext->prev(nPrev);
  126.         }        
  127.         if(nPrev) {
  128.             nPrev->next(nNext);
  129.         }
  130.         if(m_head==node)
  131.             m_head=nNext;
  132.         if(m_tail==node)
  133.             m_tail=nPrev;
  134.  
  135.         m_entries--;
  136.  
  137.         if(deleteobject) {
  138.             node->object()->DestroyObject();
  139.             delete node->object();
  140.         } else
  141.             node->object()->m_node=NULL;
  142.  
  143.         delete node;
  144.     }
  145.     
  146. }
  147.  
  148. void
  149. AFPtrDlist::cleanAndDestroy()
  150. {
  151.     while(!isEmpty())
  152.         remove(0,TRUE);
  153. }
  154.